<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>迭代器函数</title>
</head>
<body>
<p>1. 用every方法迭代</p>
<p>2. 用some方法迭代</p>
<p>3. 用forEach方法迭代</p>
<p>4. 使用map和filter方法</p>
<p>5. 使用reduce方法</p>
<p>6. 使用for...of循环迭代</p>
<script type="text/javascript">
    // 迭代器函数
    // 假如有一个数组，它值是从1到15，如果数组里的元素可以被2整除（偶数），函数就返回true，否则返回false：
    var isEven = function (x) {
        // 如果x是2的倍数，就返回true
        console.log(x)
        return (x % 2 == 0) ? true : false;
    };
    var testNum = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
    // 1. 用every方法迭代
    // every方法会迭代数组中的每个元素，直到返回false
    //在这个例子里，数组testNum的第一个元素是1，它不是2的倍数（1是奇数），因此isEven 函数返回false，然后every执行结束。
    testNum.every(isEven);

    // 2. 用some方法迭代
    // some和every的行为类似，不过some方法会迭代数组的每个元素，直到函数返回true：
    // testNum数组中第一个偶数是2（第二个元素）。第一个被迭代的元素是1，isEven会返回false。第二个被迭代的元素是2，isEven返回true——迭代结束。
    testNum.some(isEven);

    // 3. 用forEach方法迭代
    // 使用forEach不能使用break跳出循环
    testNum.forEach(function (x) {
        console.log((x % 2 == 0));
    });

    // 4. 使用map和filter方法
    // 两个会返回新数组
    var myMap = testNum.map(isEven);
    console.log(myMap)//输出：[false, true, false, true, false, true, false, true, false, true, false, true, false, true, false]
    // filter方法的新数组由使函数返回true的元素组成
    var evenNumbers = testNum.filter(isEven);
    console.log(evenNumbers)//输出：[2, 4, 6, 8, 10, 12, 14]

    // 5. 使用reduce方法
    // array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
    // function(total,currentValue, index,arr)必需。用于执行每个数组元素的函数。
    // 函数参数:total必需。初始值, 或者计算结束后的返回值。currentValue必需。当前元素。
    // currentIndex可选。当前元素的索引。arr可选。当前元素所属的数组对象。
    // initialValue可选。传递给函数的初始值
    // reduce方法停止执行后会返回这个累加器。如果要对一个数组中的所有元素求和，这就很有用，比如：
    var reduceNum = testNum.reduce(function (previous, current) {
        return previous + current;
    });
    console.log(reduceNum);//输出：120

    // 6. 使用for...of循环迭代
    for (let n of testNum) {
        console.log((n % 2 == 0) ? 'even' : 'odd');
    }
</script>
</body>
</html>
